/** 
 * @Title:工具类
 * @Desription:数据处理工具类
 * @Company:MDKG
 * @ClassName:NumberHelper.java
 * @Author:Mengfh
 * @CreateDate:2013-10-18   
 * @UpdateUser:Mengfh
 * @Version:0.1 
 *    
 */ 

package com.midian.common.utils;

import java.math.BigDecimal;
import java.text.DecimalFormat;

import org.apache.commons.lang3.StringUtils;

/** 
 * @ClassName: NumberHelper 
 * @Description: 数据处理工具类
 * @author: Mengfh
 * @date: 2013-10-18
 * 
 */
public class NumberHelper {
	/**运算：加，1*/
	public static final int ADD = 1;
	/**运算：减，2*/
	public static final int MINUS = 2;
	/**运算：乘，3*/
	public static final int MULTIPLY = 3;
	/**运算：除，4*/
	public static final int DIVIDE = 4;
	public static final DecimalFormat NUMBER_FORMAT = new DecimalFormat("#.##");
	/**
	 * 将浮点数进行四舍五入
	 * @param maxPointCount 小数个数
	 * @param targetVal 指定的浮点数值
	 * @return
	 */
	public static double opDefValBy(int maxPointCount, double targetVal) {
		BigDecimal bd = new BigDecimal(String.valueOf(targetVal));
		//根据原始数据的最大小数个数对平均值进行处理(原来最大是几位小数，平均值就截取到几位小数)，并进行四舍五入
		return bd.setScale(maxPointCount, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
	
	/**
	 * 获取值中的最大小数个数(与当前最大小数个数比较)
	 * @param val 值字符串
	 * @param maxPointCount 当前的最大小数个数
	 * @return
	 */
	private static int getMaxPointCount(String val, int maxPointCount) {
		if(StringUtils.isBlank(val)) {
			return maxPointCount;
		}
		if(!val.matches("^\\-?\\d+(\\.\\d*)?$")) {
			return maxPointCount;
		}
		if(val.indexOf(".") != -1) {
			//值类型为浮点型，获取当前值的小数个数
			int currentPointCount = val.substring(val.indexOf(".") + 1).length();
			//当前值的小数个数比之前获取的值的小数个数要大，覆盖原来的小数个数
			if(currentPointCount > maxPointCount) {
				maxPointCount = currentPointCount;
			}
		}
		return maxPointCount;
	}
	
	/**
	 * 求出两个数的精确差值(忽略不必要的精度)
	 * @param dataVal1 数值1
	 * @param dataVal2 数值2
	 * @param opType 运算类型
	 * @return
	 */
	public static Double getExactMinusVal(Double dataVal1, Double dataVal2, int opType) {
		if(dataVal1 == null || dataVal2 == null) {
			return null;
		}
		int maxPointCount = 0; //最大小数个数
		//获取两个数中最大的小数个数
		maxPointCount = getMaxPointCount(String.valueOf(dataVal1), maxPointCount);
		maxPointCount = getMaxPointCount(String.valueOf(dataVal2), maxPointCount);
		//根据最大小数个数n，求出10的n次幂(为了忽略不必要的精度，令数值变为整型后再进行相减，然后将结果还原并求出绝对值)
		double pow = Math.pow(10, maxPointCount);
		Double result = null;
		if(opType == ADD) {
			result = Math.abs(((dataVal1 * pow) + (dataVal2 * pow)) / pow); //相加
		} else if(opType == MINUS) {
			result = Math.abs(((dataVal1 * pow) - (dataVal2 * pow)) / pow); //相减
		} else if(opType == MULTIPLY) {
			result = Math.abs(((dataVal1 * pow) * (dataVal2 * pow)) / pow); //相乘
		} else if(opType == DIVIDE) {
			result = Math.abs(((dataVal1 * pow) / (dataVal2 * pow)) / pow); //相除
		}
		return result;
	}
	/**
	 * 
	 * @ClassName: NumberHelper.java
	 * @Description: 保留两位小数格式化
	 * @Author:zhucong
	 * @CreateDate:2013-11-5 下午07:40:42
	 * @param number
	 * @return
	 */
	public static String numberFormat(Number number){
		return NUMBER_FORMAT.format(number);
		
	}
}
